[毎日Kotlin] Day19. Operators overloading
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
+、* の演算子で1年たす、1日たすを実装しよう。
Implement a kind of date arithmetic. Support adding years, weeks and days to a date. You could be able to write the code like this: date + YEAR * 2 + WEEK * 3 + DAY * 15.
At first, add an extension function 'plus()' to MyDate, taking a TimeInterval as an argument. Use an utility function MyDate.addTimeIntervals() declared in DateUtil.kt
Then, try to support adding several time intervals to a date. You may need an extra class.
import TimeInterval.* data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) enum class TimeInterval { DAY, WEEK, YEAR } operator fun MyDate.plus(timeInterval: TimeInterval): MyDate = TODO() fun task1(today: MyDate): MyDate { return today + YEAR + WEEK } fun task2(today: MyDate): MyDate { TODO("Uncomment") //return today + YEAR * 2 + WEEK * 3 + DAY * 5 } import java.util.Calendar fun MyDate.addTimeIntervals(timeInterval: TimeInterval, number: Int): MyDate { val c = Calendar.getInstance() c.set(year, month, dayOfMonth) when (timeInterval) { TimeInterval.DAY -> c.add(Calendar.DAY_OF_MONTH, number) TimeInterval.WEEK -> c.add(Calendar.WEEK_OF_MONTH, number) TimeInterval.YEAR -> c.add(Calendar.YEAR, number) } return MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE)) }
狙い
ここで考えて欲しい問題の意図はなんだろうか?
today + YEAR * 2 + WEEK * 3 + DAY * 5
こういう記述が、本当に幸せかっというのはおいておいて、作れる技術は身につけよう。いつか役に立つはず。
解答例
operator fun MyDate.plus(timeInterval: TimeInterval) = addTimeIntervals(timeInterval, 1) class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int) operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number) operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval) = addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)
今回もこちらのルールに則りoverloadします。
Operator overloading - Kotlin Programming Language
MyDate.addTimeIntervalsをすでに用意してくれている状態なので、それぞれの演算子の意味に合わせて呼んであげればいいだけです。
オレオレ演算子の規約は簡単につくれます。
この章は毎日連続した課題です。だんだんついてくるのがしんどくなってきたと思います。この章の終わりにハイライト記事をかくので、お楽しみに。
あとがき
Day20.でまたお会いしましょう。